package Symulator2009;

import java.awt.Color;
import java.awt.Graphics;
import java.util.LinkedList;

public class Movement {
	private int x,y; //pozycja samochodu
	private int numerSW; //nueracja swiatel
	private int s2o; //odleglosc od poprzedzajacego samochodu//do skasowania
	private int sx; //odleglosc od sam ochodziku przed nim
	private double pretk; //pretkosc obecna max to 14m/s
	private double przysp; //przyspieszenie
	private double droga;  //przebyta droga
	private int min1; //minimalno odleglosc miedzy samochodami
	private int odswierzanie; //w mili sek
	private double pretkoscmax; //w m/s max to 14m/s okolo 54kmh
	private double hamow; //pretkosc hamowania
	private boolean czyRysowac; //wysuje dopiero jak jest wlaczony do ruchu
	private boolean pom;
	private boolean start;
	private boolean var;//warunek sprzawdzania miejsca czy samochod jest poza skrzyzowaniem
	private int vstartx;
	private int vstarty;
	private int dx;
	private int dy;
	private Lights li;
	public Movement(int vh,int x, int y,int dx,int dy,Lights list) {
		this.li=list;
		this.x=x;
		this.y=y;
		przysp=2;
		pretkoscmax=14;
		if(vh==1)
		droga=x;
		else if(vh==2)
		droga=y;
		else
		droga=0;
		odswierzanie=Data.getReloadSpeed();
		czyRysowac=false;
		min1=40;
		numerSW=0;
		pretk=14;
		pom=false;
		hamow=5;
		var=false;
		this.dx=dx;
		this.dy=dy;
		vstartx=x;
		vstarty=y;
	}
	
	/**
	 * 	 * @param g - potrzebny do rysowania aut
	 * @info obecnie w trakcie tworzenia  - problem czy pobierac dane a czy pobierac dane b
	 * blad przy odswierzaniu poprawic i bedzie gites i do tego jeszcze poprawic swiatla zeby dzialaly nie na czas a na iteracje XD
	 */
	
	public void Move2(Graphics g){
		//czy ruszch poziomy czy pionowy wedlug tego inne kolory siwatel
		//jesli nie przebyl drogi to nie jest narysowany - w ten sposob nie bedzie zludzenia ze ostani samochodzk ciagle stoi
		if(droga>5){
			czyRysowac=true;
		}
		//if(s2o==-1)
		//	isfirst=true;
		//else
		//	isfirst=false;
		
		//if(droga+min1<s2o || isfirst==false)
		//wywalic warunek is first za duzoi zbednych bajerow
		//if(!isfirst){
		if(s2o>min1 || pom==true)
		{
			pom=true;
				if(droga<=(li.getLight(numerSW).getstopXa()+min1) && s2o>min1){//przyspieszaj
					if(pretk==pretkoscmax)
					{
						droga=droga+pretk*odswierzanie/1000.0;
						//rysuj staly samochodzik
						drawYellowCar(g);
					}
					else
					{
						pretk=pretk+przysp*odswierzanie/1000.0;
						if(pretk>pretkoscmax) {
							pretk=pretkoscmax;
							droga=droga+pretk*odswierzanie/1000.0;
							drawYellowCar(g);
						}
						else{
							droga=droga+pretk*odswierzanie/1000.0;
							//rysuj przysp samochodzik
							drawGreenCar(g);
						}
					}
				}
				else if(droga>(li.getLight(numerSW).getstopXa()+min1) && s2o>min1){//jestes w strefie przed swiatlami hamuj jesli czerwone lub jedz dalej
					//if(swiatla[numerSW]==true)
					if(li.getLight(numerSW).getA())
					{
						//czy zielone swaitlo - jak zielone to jedz dalej - zminic pozniej warunek ifa
						if(pretk==pretkoscmax)
						{
							droga=droga+pretk*odswierzanie/1000.0;
							//rysuj staly samochodzik
							drawYellowCar(g);
						}
						else
						{
							pretk=pretk+przysp*odswierzanie/1000.0;
							if(pretk>pretkoscmax) {
								pretk=pretkoscmax;
								droga=droga+pretk*odswierzanie/1000.0;
								drawYellowCar(g);
							}
							else{
								droga=droga+pretk*odswierzanie/1000.0;
								//rysuj przysp samochodzik
								drawGreenCar(g);
							}
						}
						//zmien swiatlo jak zle przejechales przez swiatla
						numerSW++;
						/**
						 * miejsce gdzie tzrzba dodac kod zwiazny z zachowaniem sie pojazdu po tym jak przejdzie przez ostanie swiatla
						 * 
						 * **/
					}
					else
					{//czerwone wiec hamuj 
						pretk=pretk-hamow*odswierzanie/1000.0;
						if(pretk<0) {
							pretk=0;
							drawGrayCar(g);
							//rysuj zwalniajacy samochodzik
						}
						else{
							droga=droga+pretk*odswierzanie/1000.0;
							drawRedCar(g);
							System.out.println("1");
							}
					}
				}
				else 
				{
					pretk=pretk-hamow*odswierzanie/1000.0;
					if(pretk<0) {
						pretk=0;
						drawGrayCar(g);
						//rysuj zwalniajacy samochodzik
					}
					else{
						droga=droga+pretk*odswierzanie/1000.0;
						drawRedCar(g);
						System.out.println("2");
						}
				}
				}
				x=(int)droga;
			}
	//zmienic algorytm hamowania w stosunku do pojazdow kore stoja i ktore jada - zmienia sie przestrzen pomiedzy ppjazdami - wplywa to bednie na wynik przystosowania w malym stopniujednak zauwazalne jest to i powinno zostac poprawione
	//zmienic hamowanie na sposob taki jak przyspieszanie i poprawic pod koniec to
	public void Move3(Graphics g){
		boolean a=false;
		boolean b=true;;
		if(droga>5)
			czyRysowac=true;
		if(sx>min1){
		if(x+min1>sx)
		{//czerwone wiec hamuj 
			pretk=pretk-hamow*odswierzanie/1000.0;
			if(pretk<0) {
				pretk=0;
				drawGrayCar(g);
				//rysuj zwalniajacy samochodzik
			}
			else{
				droga=droga+pretk*odswierzanie/1000.0;
				drawRedCar(g);
				}
		}
		else
			a=true;
		//sprawdzenie cze wyjechal samochod poza skrzyzowanie
		if(var)
			if(x>li.getLight(numerSW-1).getstopXb()){
				li.getLight(numerSW-1).setCountA(li.getLight(numerSW-1).getCountA()-1);
				var=false;
			}
		if(droga>li.getLight(numerSW).getstopXa()-min1){
			if(li.getLight(numerSW).getA()==true && li.getLight(numerSW).getCountB()==0){
				b=true;
				li.getLight(numerSW).setCountA(li.getLight(numerSW).getCountA()+1);
				var=true;
				numerSW++;
				
			}
			else
			{
				//czerwone wiec hamuj 
				pretk=pretk-hamow*odswierzanie/1000.0;
				if(pretk<0) {
					pretk=0;
					drawGrayCar(g);
					//rysuj zwalniajacy samochodzik
				}
				else{
					droga=droga+pretk*odswierzanie/1000.0;
					drawRedCar(g);
					}
				b=false;//dziwne zachowanie
			}
		}
		//warunek taki zeby nie stal na skrzyzowaniu do opracowania na podstawie testow - podobny jak z sx ale bedzie brany inny samochod pod uwage oraz wiecej parametrow, jak i droga hamowania
		//
		if(a==true&&b==true)
		{//przyspiesza
			pretk=pretk+przysp*odswierzanie/1000.0;
			if(pretk>pretkoscmax) {
				pretk=pretkoscmax;
				droga=droga+pretk*odswierzanie/1000.0;
				drawYellowCar(g);
			}
			else{
				droga=droga+pretk*odswierzanie/1000.0;
				//rysuj przysp samochodzik
				drawGreenCar(g);
			}
		}
		x=(int)droga;
		}	
		
	}
	
	public void Move4(Graphics g){//poruszanie inne zmienic dzialania i x na y
		boolean a=false;
		boolean b=true;;
		if(droga>50)
			czyRysowac=true;
		if(sx>min1+50){
		if(y+min1>sx)
		{//czerwone wiec hamuj 
			pretk=pretk-hamow*odswierzanie/1000.0;
			if(pretk<0) {
				pretk=0;
				drawGrayCar(g);
				//rysuj zwalniajacy samochodzik
			}
			else{
				droga=droga+pretk*odswierzanie/1000.0;
				drawRedCar(g);
				}
		}
		else
			a=true;
		
		//sprawdzenie cze wyjechal samochod poza skrzyzowanie
		if(var)
			if(y>li.getLight(numerSW-1).getstopYb()){
				li.getLight(numerSW-1).setCountB(li.getLight(numerSW-1).getCountB()-1);
				var=false;
			}
		if(droga>li.getLight(numerSW).getstopYa()-min1){
			if(li.getLight(numerSW).getB()==true && li.getLight(numerSW).getCountA()==0){
				b=true;
				li.getLight(numerSW).setCountB(li.getLight(numerSW).getCountB()+1);
				var=true;
				numerSW++;
				
			}
			else
			{
				//czerwone wiec hamuj 
				pretk=pretk-hamow*odswierzanie/1000.0;
				if(pretk<0) {
					pretk=0;
					drawGrayCar(g);
					//rysuj zwalniajacy samochodzik
				}
				else{
					droga=droga+pretk*odswierzanie/1000.0;
					drawRedCar(g);
					}
				b=false;//dziwne zachowanie
			}
		}
		//warunek taki zeby nie stal na skrzyzowaniu do opracowania na podstawie testow - podobny jak z sx ale bedzie brany inny samochod pod uwage oraz wiecej parametrow, jak i droga hamowania
		//
		if(a==true&&b==true)
		{//przyspiesza
			pretk=pretk+przysp*odswierzanie/1000.0;
			if(pretk>pretkoscmax) {
				pretk=pretkoscmax;
				droga=droga+pretk*odswierzanie/1000.0;
				drawYellowCar(g);
			}
			else{
				droga=droga+pretk*odswierzanie/1000.0;
				//rysuj przysp samochodzik
				drawGreenCar(g);
			}
		}
		y=(int)droga;
		}	
		
	}
	
	
	
	public void Move5(Graphics g){//poruszanie inne zmienic dzialania i x na y
		boolean a=false;
		boolean b=true;;
		if(droga>0)
			czyRysowac=true;
		if(sx<vstarty-min1){
		if(y<sx+min1 )
		{//czerwone wiec hamuj 
			pretk=pretk-hamow*odswierzanie/1000.0;
			if(pretk<0) {
				pretk=0;
				drawGrayCar(g);
				//rysuj zwalniajacy samochodzik
			}
			else{
				droga=droga+pretk*odswierzanie/1000.0;
				drawRedCar(g);
				}
		}
		else
			a=true;
		//sprawdzenie cze wyjechal samochod poza skrzyzowanie
		
		if(var)
			if(y<li.getLight(numerSW-1).getstopYa()){
				li.getLight(numerSW-1).setCountB(li.getLight(numerSW-1).getCountB()-1);
				var=false;
			}
		if(y<li.getLight(numerSW).getstopYb()+min1){
			if(li.getLight(numerSW).getB()==true && li.getLight(numerSW).getCountA()==0){
				b=true;
				li.getLight(numerSW).setCountB(li.getLight(numerSW).getCountB()+1);
				var=true;
				numerSW++;
				
			}
			else
			{
				//czerwone wiec hamuj 
				pretk=pretk-hamow*odswierzanie/1000.0;
				if(pretk<0) {
					pretk=0;
					drawGrayCar(g);
					//rysuj zwalniajacy samochodzik
				}
				else{
					droga=droga+pretk*odswierzanie/1000.0;
					drawRedCar(g);
					}
				b=false;//dziwne zachowanie
			}
		}
		
		//warunek taki zeby nie stal na skrzyzowaniu do opracowania na podstawie testow - podobny jak z sx ale bedzie brany inny samochod pod uwage oraz wiecej parametrow, jak i droga hamowania
		//
		if(a==true&&b==true)
		{//przyspiesza
			pretk=pretk+przysp*odswierzanie/1000.0;
			if(pretk>pretkoscmax) {
				pretk=pretkoscmax;
				droga=droga+pretk*odswierzanie/1000.0;
				drawYellowCar(g);
			}
			else{
				droga=droga+pretk*odswierzanie/1000.0;
				//rysuj przysp samochodzik
				drawGreenCar(g);
			}
		}
		y=(int) (vstarty-droga);
		}	
		
		
	}

	public void Move6(Graphics g){//poruszanie inne zmienic dzialania i x na y
		boolean a=false;
		boolean b=true;;
		if(droga>0)
			czyRysowac=true;
		if(sx<vstartx-min1){
		if(sx>x-min1 )
		{//czerwone wiec hamuj 
			pretk=pretk-hamow*odswierzanie/1000.0;
			if(pretk<0) {
				pretk=0;
				drawGrayCar(g);
				//rysuj zwalniajacy samochodzik
			}
			else{
				droga=droga+pretk*odswierzanie/1000.0;
				drawRedCar(g);
				}
		}
		else
			a=true;
		//sprawdzenie cze wyjechal samochod poza skrzyzowanie
		
		if(var)
			if(x<li.getLight(numerSW-1).getstopXa()){
				li.getLight(numerSW-1).setCountA(li.getLight(numerSW-1).getCountA()-1);
				var=false;
			}
		if(x<li.getLight(numerSW).getstopXb()+min1){
			if(li.getLight(numerSW).getA()==true && li.getLight(numerSW).getCountB()==0){
				b=true;
				li.getLight(numerSW).setCountA(li.getLight(numerSW).getCountA()+1);
				var=true;
				numerSW++;
				
			}
			else
			{
				//czerwone wiec hamuj 
				pretk=pretk-hamow*odswierzanie/1000.0;
				if(pretk<0) {
					pretk=0;
					drawGrayCar(g);
					//rysuj zwalniajacy samochodzik
				}
				else{
					droga=droga+pretk*odswierzanie/1000.0;
					drawRedCar(g);
					}
				b=false;//dziwne zachowanie
			}
		}
		
		//warunek taki zeby nie stal na skrzyzowaniu do opracowania na podstawie testow - podobny jak z sx ale bedzie brany inny samochod pod uwage oraz wiecej parametrow, jak i droga hamowania
		//
		if(a==true&&b==true)
		{//przyspiesza
			pretk=pretk+przysp*odswierzanie/1000.0;
			if(pretk>pretkoscmax) {
				pretk=pretkoscmax;
				droga=droga+pretk*odswierzanie/1000.0;
				drawYellowCar(g);
			}
			else{
				droga=droga+pretk*odswierzanie/1000.0;
				//rysuj przysp samochodzik
				drawGreenCar(g);
			}
		}
		x=(int) (vstartx-droga);
		}	
		
		
	}
	
//------------------------------------------------------------------------------------------------------------------------------------
//************************************************************************************************************************************
//------------------------------------------------------------------------------------------------------------------------------------
			//koncowe obliczenia wylacznie dla testu ustawione na stale - ale beda zmienione - prawdopodbnie wedlug todzaju co i spowoduje miznaw ifow bo deda 4 roznoe movy
			// powinno to byc wstaione przed momentem malowania ale dla celow testowych i jasnosci pozostanie to tutaj
			//li.get(numerSW).getWhereStopX() - dla y zminic trzeba - beda 4 movy kazdy dla danej listy elementow
	//}
	private void drawRedCar(Graphics g){
		if(czyRysowac){
		Color c=g.getColor();
		g.setColor(Color.red);
		g.fill3DRect(x, y, dx, dy, true);
		g.setColor(c);
		}
	}
	private void drawYellowCar(Graphics g){
		if(czyRysowac){
		Color c=g.getColor();
		g.setColor(Color.yellow);
		g.fill3DRect(x, y, dx, dy, true);
		g.setColor(c);
		}
	}
	private void drawGreenCar(Graphics g){
		if(czyRysowac){
		Color c=g.getColor();
		g.setColor(Color.green);
		g.fill3DRect(x, y, dx, dy, true);
		g.setColor(c);
		}
	}
	private void drawGrayCar(Graphics g){
		if(czyRysowac){
		Color c=g.getColor();
		g.setColor(Color.gray);
		g.fill3DRect(x, y, dx, dy, true);
		g.setColor(c);
		}
	}

	public int getX() {
		return x;
	}

	public int getY() {
		return y;
	}
	
	//public void setsx(int z){
	//	sx=z;
	//}
	
	public void setCarParams(int z){
		sx=z;
	}
	
	
	public boolean getIfStart(){
		return start;
	}
}
//swiatla - konstruktor etc
//generowanie pojazdow etc
//caly mechanizm i rozmiary -  zmiana testowanie i wdrozenie 

